/**
 * 
 */
package com.sicocre.business.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import com.sicocre.beans.Asesor;
import com.sicocre.beans.EmpleadoBean;
import com.sicocre.beans.Gerente;
import com.sicocre.beans.Sucursal;
import com.sicocre.business.dao.IEmpleadoDao;

/**
 * @author lserrano
 *
 */

@Repository
public class EmpleadoDaoImpl implements IEmpleadoDao {


	private JdbcTemplate jdbcTemplate;

	public static final String INSERT_EMPLEADO = "INSERT INTO sicocre.empleado(nombre_empleado,apater_empleado,amater_empleado,edad,sexo_empleado,edociv_empleado,fch_nac_empleado,nac_empleado,tel_casa_empleado,celular_empleado,mail_empleado,puesto_empleado,domicilio, ciudad, estado, codigo_postal, cve_gerente,cve_sucursal) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
	public static final String SELECT_GERENTES = "SELECT * FROM EMPLEADO a, SUCURSAL b WHERE a.cve_sucursal = b.cve_sucursal and puesto_empleado like 'GERENTE'";
	public static final String SELECT_SUCURSALES = "select * from sucursal";
	public static final String SELECT_GERENTE_BY_ID = "SELECT * FROM EMPLEADO a, SUCURSAL b WHERE a.cve_sucursal = b.cve_sucursal and a.puesto_empleado like 'GERENTE' and a.cve_empleado = ?";
	public static final String SELECT_ASESORES = "SELECT * FROM EMPLEADO WHERE puesto_empleado like 'ASESOR'";

	@Autowired
	public void setDataSource(DataSource ds){
		jdbcTemplate=new JdbcTemplate(ds);
	}



	public int insertar(EmpleadoBean empleado) {
		// TODO Auto-generated method stub
		int insertEmpleado =0;
		if(empleado.getPuesto().equals("GERENTE")){
			Gerente empGerente = (Gerente)empleado;
			insertEmpleado= jdbcTemplate.update(INSERT_EMPLEADO,new Object[]{empleado.getNombre(),empleado.getaPaterno(),empleado.getaMaterno(),empleado.getEdad(),empleado.getSexo(),
					empleado.getEdoCivil(),empleado.getFchNac(),empleado.getNacionalidad(),empleado.getTelefonoCasa(), empleado.getCelular(),empleado.getMail(),empleado.getPuesto(),
					empleado.getCalle(), empleado.getCiudad(), empleado.getEstado(), empleado.getCodigoPostal(),0,empGerente.getSucursal().getClave()});
		}else if(empleado.getPuesto().equals("ASESOR")){
			Asesor empAsesor = (Asesor)empleado;
			insertEmpleado= jdbcTemplate.update(INSERT_EMPLEADO,new Object[]{empleado.getNombre(),empleado.getaPaterno(),empleado.getaMaterno(),empleado.getEdad(),empleado.getSexo(),
					empleado.getEdoCivil(),empleado.getFchNac(),empleado.getNacionalidad(),empleado.getTelefonoCasa(), empleado.getCelular(),empleado.getMail(),empleado.getPuesto(),
					empleado.getCalle(), empleado.getCiudad(), empleado.getEstado(), empleado.getCodigoPostal(),empAsesor.getGerente().getCveEmpleado(),0});
		}
		return insertEmpleado;
	}



	public List<Gerente> getGerentes() {
		// TODO Auto-generated method stub

		List<Gerente> gerentes = jdbcTemplate.query(SELECT_GERENTES, new RowMapper<Gerente>() {

			public Gerente mapRow(ResultSet rs, int rowNum)
					throws SQLException {

				Gerente empleado = new Gerente();
				empleado.setaMaterno(rs.getString("amater_empleado"));
				empleado.setaPaterno(rs.getString("apater_empleado"));
				empleado.setNombre(rs.getString("nombre_empleado"));
				empleado.setNacionalidad(rs.getString("nac_empleado"));
				empleado.setCalle(rs.getString("domicilio"));
				empleado.setCelular(rs.getString("celular_empleado"));
				empleado.setCiudad(rs.getString("ciudad"));
				empleado.setCodigoPostal(rs.getString("codigo_postal"));
				empleado.setCveEmpleado(rs.getInt(("cve_empleado")));
				empleado.setEdad(rs.getInt("edad"));
				empleado.setEdoCivil(rs.getString("edociv_empleado"));
				empleado.setEstado(rs.getString("estado"));
				empleado.setFchNac(rs.getDate("fch_nac_empleado"));
				empleado.setMail(rs.getString("mail_empleado"));
				empleado.setPuesto(rs.getString("puesto_empleado"));
				empleado.setSexo(rs.getString("sexo_empleado"));
				empleado.setTelefonoCasa(rs.getString("tel_casa_empleado"));
				Sucursal sucursal = new Sucursal();
				sucursal.setClave(rs.getInt(("cve_sucursal")));
				sucursal.setDescripcion(rs.getString("desc_sucursal"));
				sucursal.setNombre(rs.getString("nombre_sucursal"));
				empleado.setSucursal(sucursal);

				return empleado;
			}
		});
		return gerentes;
	}


	private Gerente getGerenteById(int clave) {
		// TODO Auto-generated method stub

		Gerente gerente = jdbcTemplate.query(SELECT_GERENTE_BY_ID,new Object[]{clave}, new ResultSetExtractor<Gerente>() {
			public Gerente extractData(ResultSet rs) throws SQLException,
			DataAccessException {
				if(rs.next()){
					Gerente empleado = new Gerente();
					empleado.setaMaterno(rs.getString("amater_empleado"));
					empleado.setaPaterno(rs.getString("apater_empleado"));
					empleado.setNombre(rs.getString("nombre_empleado"));
					empleado.setNacionalidad(rs.getString("nac_empleado"));
					empleado.setCalle(rs.getString("domicilio"));
					empleado.setCelular(rs.getString("celular_empleado"));
					empleado.setCiudad(rs.getString("ciudad"));
					empleado.setCodigoPostal(rs.getString("codigo_postal"));
					empleado.setCveEmpleado(rs.getInt(("cve_empleado")));
					empleado.setEdad(rs.getInt("edad"));
					empleado.setEdoCivil(rs.getString("edociv_empleado"));
					empleado.setEstado(rs.getString("estado"));
					empleado.setFchNac(rs.getDate("fch_nac_empleado"));
					empleado.setMail(rs.getString("mail_empleado"));
					empleado.setPuesto(rs.getString("puesto_empleado"));
					empleado.setSexo(rs.getString("sexo_empleado"));
					empleado.setTelefonoCasa(rs.getString("tel_casa_empleado"));
					Sucursal sucursal = new Sucursal();
					sucursal.setClave(rs.getInt(("cve_sucursal")));
					sucursal.setDescripcion(rs.getString("desc_sucursal"));
					sucursal.setNombre(rs.getString("nombre_sucursal"));
					empleado.setSucursal(sucursal);

					return empleado;
				}
				return null;
			}
		});
		return gerente;
	}


	/* (non-Javadoc)
	 * @see com.sicocre.business.dao.IEmpleadoDao#getSucursales()
	 */
	public List<Sucursal> getSucursales() {
		// TODO Auto-generated method stub
		return jdbcTemplate.query(SELECT_SUCURSALES, new RowMapper<Sucursal>() {

			public Sucursal mapRow(ResultSet rs, int rowNum)
					throws SQLException {
				// TODO Auto-generated method stub
				Sucursal sucursal = new Sucursal();
				sucursal.setClave(rs.getInt(("cve_sucursal")));
				sucursal.setDescripcion(rs.getString("desc_sucursal"));
				sucursal.setNombre(rs.getString("nombre_sucursal"));
				return sucursal;
			}
		});
	}



	public List<Asesor> getAsesores() {
		List<Asesor> asesores = jdbcTemplate.query(SELECT_ASESORES, new RowMapper<Asesor>() {

			public Asesor mapRow(ResultSet rs, int rowNum) throws SQLException {
				Asesor empleado = new Asesor();
				empleado.setaMaterno(rs.getString("amater_empleado"));
				empleado.setaPaterno(rs.getString("apater_empleado"));
				empleado.setNombre(rs.getString("nombre_empleado"));
				empleado.setNacionalidad(rs.getString("nac_empleado"));
				empleado.setCalle(rs.getString("domicilio"));
				empleado.setCelular(rs.getString("celular_empleado"));
				empleado.setCiudad(rs.getString("ciudad"));
				empleado.setCodigoPostal(rs.getString("codigo_postal"));
				empleado.setCveEmpleado(rs.getInt(("cve_empleado")));
				empleado.setEdad(rs.getInt("edad"));
				empleado.setEdoCivil(rs.getString("edociv_empleado"));
				empleado.setEstado(rs.getString("estado"));
				empleado.setFchNac(rs.getDate("fch_nac_empleado"));
				empleado.setMail(rs.getString("mail_empleado"));
				empleado.setPuesto(rs.getString("puesto_empleado"));
				empleado.setSexo(rs.getString("sexo_empleado"));
				empleado.setTelefonoCasa(rs.getString("tel_casa_empleado"));
				empleado.setGerente(getGerenteById(rs.getInt("cve_gerente")));
				return empleado;
			}
		});
		return asesores;
	}



}
